// Package controllers 包含应用程序的控制器逻辑。
// 本文件用于处理汇率相关的 HTTP 请求。
package controllers

import (
	"errors"             // 提供错误处理功能
	"exchangeapp/global" // 导入全局变量包，用于访问数据库实例
	"exchangeapp/models" // 导入模型包，用于操作数据库表
	"net/http"           // 提供 HTTP 请求和响应的相关功能
	"time"               // 用于获取当前时间

	"github.com/gin-gonic/gin" // Gin 是一个轻量级的 Web 框架
	"gorm.io/gorm"             // GORM 是一个流行的 ORM 框架
)

// CreateExchangeRate 创建汇率记录
// @Summary 创建新的汇率记录
// @Description 接收 JSON 格式的汇率数据并存入数据库
// @Tags 汇率管理
// @Accept json
// @Produce json
// @Param exchangeRate body models.ExchangeRate true "汇率数据"
// @Success 201 {object} models.ExchangeRate "成功创建汇率记录"
// @Failure 400 {object} gin.H "请求数据格式错误"
// @Failure 500 {object} gin.H "数据库操作错误"
// @Router /exchange-rates [post]
func CreateExchangeRate(ctx *gin.Context) {
	// 声明一个 ExchangeRate 结构体变量，用于接收请求数据
	var exchangeRate models.ExchangeRate

	// 将请求体中的 JSON 数据绑定到 exchangeRate 变量
	if err := ctx.ShouldBindJSON(&exchangeRate); err != nil {
		// 如果绑定失败，返回 400 错误和错误信息
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	// 设置汇率的日期为当前时间
	exchangeRate.Date = time.Now()

	// 自动迁移数据库表结构
	if err := global.Db.AutoMigrate(&exchangeRate); err != nil {
		ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	// 插入新汇率记录到数据库
	if err := global.Db.Create(&exchangeRate).Error; err != nil {
		ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	// 返回成功创建的汇率记录
	ctx.JSON(http.StatusCreated, exchangeRate)
}

// GetExchangeRates 获取所有汇率记录
// @Summary 获取所有汇率记录
// @Description 从数据库中查询所有汇率记录
// @Tags 汇率管理
// @Produce json
// @Success 200 {array} models.ExchangeRate "汇率记录列表"
// @Failure 500 {object} gin.H "数据库操作错误"
// @Router /exchange-rates [get]
func GetExchangeRates(ctx *gin.Context) {
	// 声明一个切片用于存储查询结果
	var exchangeRates []models.ExchangeRate

	// 查询所有汇率记录
	if err := global.Db.Find(&exchangeRates).Error; err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			// 如果没有记录，返回 404 错误
			ctx.JSON(http.StatusNotFound, gin.H{"error": err.Error()})
		} else {
			// 如果发生其他错误，返回 500 错误
			ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		}
		return
	}

	// 返回查询结果
	ctx.JSON(http.StatusOK, exchangeRates)
}
